﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using QuanCafe_DAO_WS;

namespace QuanCafe
{
    public class PhieuDatThucUongDAO : DataProvider
    {

        // viết hàm lấy lên danh sách phiếu đặt thức uống
        public List<PhieuDatThucUongDTO> PD_LayDanhSachPhieuDat()
        {
            // tạo 1 biến linq
            LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
            // lấy ra danh sách
            var phieuDats = data.PhieuDatThucUongs.OrderBy(temp => temp.maphieu);

            // tạo 1 đối tượng List để trả về
            List<PhieuDatThucUongDTO> PhieuDats = new List<PhieuDatThucUongDTO>();

           // truy vấn
            foreach (PhieuDatThucUong pd in phieuDats)
            {
                //  tạo ra 1 object
                object obj = GetDataFromDataConText(pd);
                // đưa object vào list
                PhieuDats.Add((PhieuDatThucUongDTO)obj);
            }
            return PhieuDats;

        }

        // viết hàm tạo mã phiếu đặt
        public string PD_LayMaPhieuDat(string maban, float tongtien)
        {
            try
            {
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // tạo 1 biến phieudat
                PhieuDatThucUong pd = new PhieuDatThucUong();
                // lấy mã phiếu
                string s = LayMaPhieu();
                pd.maphieu = s;
                pd.maban = maban;
                pd.tongtien = tongtien;
                pd.trangthai = "Đang được đặt";
                // cập nhật
                data.PhieuDatThucUongs.InsertOnSubmit(pd);
                data.SubmitChanges();
                return s;
            }
            catch
            {
                return null;
            }
        }

        // lấy danh sách thức uống được đặt
        public List<ThucUongDuocDatDTO> PD_LayDanhSachThucUong(string maphieu)
        {
            try
            {
                // tạo biến data
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // tạo lớp thucUongDuocDat
                ThucUongDuocDatDAO thucUongDuocDatDAO = new ThucUongDuocDatDAO();
                // lấy về danh sách
                return thucUongDuocDatDAO.TUDD_LayDanhSachThucUong(maphieu); 
            }
            catch
            {
                return null;
            }
        }

        // viết hàm lấy số lượng thức uống của phiếu
        public int PD_LaySoLuongThucUong(string maphieu)
        {
            try
            {
                // tạo biến data
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // tạo lớp thucUongDuocDat
                ThucUongDuocDatDAO thucUongDuocDatDAO = new ThucUongDuocDatDAO();
                // lấy về danh sách
                return thucUongDuocDatDAO.TUDD_LaySoLuongThucUong(maphieu);
            }
            catch
            {
                return -1;
            }
        }

        // viết hàm cập nhật thông tin phiếu đặt
        public bool PD_CapNhatThongTin(string maphieu, string maban, float tongtien, string trangthai)
        {
            try
            {
                // tạo 1 biến linq
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // kiểm tra
                if (PD_CoPhieuDatDuocCapNhat(maphieu) == true)
                {
                    // lấy ra phieudat đó
                    PhieuDatThucUong pd = data.PhieuDatThucUongs.Single(temp => temp.maphieu == maphieu);
                    // cập nhật lại thông tin
                    pd.maban = maban;
                    pd.tongtien = tongtien;
                    pd.trangthai = trangthai;
                    data.SubmitChanges();
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch
            {
                return false;
            }
        }

        // viết hàm kiểm tra xem có phiếu đặt nào được cập nhật ko
        public bool PD_CoPhieuDatDuocCapNhat(string maphieu)
        {
            try
            {
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                if (PD_DaTonTaiPhieuDat(maphieu) == true) // có người cập nhật
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch
            {
                return false;
            }
        }

        // viết hàm kiểm tra phieudat
        public bool PD_DaTonTaiPhieuDat(string maphieu)
        {
            // tạo 1 biến linq
            LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
            // lấy ra phiếu đặt
            var phieuDats = data.PhieuDatThucUongs.Where(temp => true);
            // kiểm tra
            // kiểm tra: Any(điều kiện): có bất kì phần tử nào thỏa không?
            if (phieuDats.Any(temp => (temp.maphieu == maphieu))) // có
            {
                return true;
            }
            else
            {
                return false;
            }
        }


        // viết hàm xóa phiếu đặt thức uống
        public bool PD_XoaPhieuDat(string maphieu)
        {
            try
            {
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                if (PD_DaTonTaiPhieuDat(maphieu) == true) 
                {
                    //lấy ra phiếu đặt cần xóa
                    PhieuDatThucUong pd = data.PhieuDatThucUongs.Single(temp => temp.maphieu == maphieu);
                    // xóa nó đi
                    data.PhieuDatThucUongs.DeleteOnSubmit(pd);
                    // cập nhật lại
                    data.SubmitChanges();
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch
            {
                return false;
            } 
        }

        // viết lại hàm GetDataFromDataConText
        private  object GetDataFromDataConText(PhieuDatThucUong pd)
        {
            PhieuDatThucUongDTO phieuDatThucUongDTO = new PhieuDatThucUongDTO();
            phieuDatThucUongDTO.Maphieu = pd.maphieu;
            phieuDatThucUongDTO.Maban = pd.maban;
            phieuDatThucUongDTO.Trangthai = pd.trangthai;
            phieuDatThucUongDTO.Tongtien = (float)pd.tongtien;

            // trả về kiểu object
            return (object)phieuDatThucUongDTO;

        }

        // viết hàm lấy mã phiếu đặt
        private string LayMaPhieu()
        {
            Random r = new Random();
            char[] c;
            string s = "";
            c = new char[10];
            string chuoikytu = "ASDFGHJKLQWERTYUIOPZXCVBNM1234567890";
            if (DateTime.Now.Hour < 12)
            {
                s = "SA" + DateTime.Now.Day.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Year.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString();

            }
            else
            {
                s = "CH" + DateTime.Now.Day.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Year.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString();
            }

            for (int i = 0; i < 10; i++)
            {
                c[i] = chuoikytu[r.Next(chuoikytu.Length)];
                s += c[i].ToString();
            }
            return s;
        }

        #region Viết các hàm tra cứu

        
        public List<PhieuDatThucUongDTO> PD_TraPhieuDatTheoMaBan(string maban)
        {
            try
            {
                // tạo 1 biến linq
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // lấy ra danh sách
                var phieuDats = data.PhieuDatThucUongs.Where(temp => temp.maban == maban);

                // tạo 1 đối tượng List để trả về
                List<PhieuDatThucUongDTO> PhieuDats = new List<PhieuDatThucUongDTO>();

                // truy vấn
                foreach (PhieuDatThucUong pd in phieuDats)
                {
                    //  tạo ra 1 object
                    object obj = GetDataFromDataConText(pd);
                    // đưa object vào list
                    PhieuDats.Add((PhieuDatThucUongDTO)obj);
                }
                return PhieuDats;
            }
            catch (Exception e)
            {
                return null;
            }
        }

        public List<PhieuDatThucUongDTO> PD_TraPhieuDatTheoTrangThai(string trangthai)
        {
            try
            {
                // tạo 1 biến linq
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // lấy ra danh sách
                var phieuDats = data.PhieuDatThucUongs.Where(temp => temp.trangthai.StartsWith(trangthai) == true);

                // tạo 1 đối tượng List để trả về
                List<PhieuDatThucUongDTO> PhieuDats = new List<PhieuDatThucUongDTO>();

                // truy vấn
                foreach (PhieuDatThucUong pd in phieuDats)
                {
                    //  tạo ra 1 object
                    object obj = GetDataFromDataConText(pd);
                    // đưa object vào list
                    PhieuDats.Add((PhieuDatThucUongDTO)obj);
                }
                return PhieuDats;
            }
            catch (Exception e)
            {
                return null;
            }
        }

        public List<PhieuDatThucUongDTO> PD_TraPhieuDatTheoTongTien(float TongTien)
        {
            try
            {
                // tạo 1 biến linq
                LinkQ2QuanCafeDataContext data = new LinkQ2QuanCafeDataContext();
                // lấy ra danh sách
                var phieuDats = data.PhieuDatThucUongs.Where(temp => temp.tongtien == TongTien).OrderBy(temp => temp.maban);

                // tạo 1 đối tượng List để trả về
                List<PhieuDatThucUongDTO> PhieuDats = new List<PhieuDatThucUongDTO>();

                // truy vấn
                foreach (PhieuDatThucUong pd in phieuDats)
                {
                    //  tạo ra 1 object
                    object obj = GetDataFromDataConText(pd);
                    // đưa object vào list
                    PhieuDats.Add((PhieuDatThucUongDTO)obj);
                }
                return PhieuDats;
            }
            catch (Exception e)
            {
                return null;
            }
        }

        #endregion

    }
}
